#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020-11-20 22:46
# @Author : youngchaolin

print()

'''
1 re模块结尾
findall search
split sub subn match compile finditer
2 带参数的装饰器
3 递归函数
'''

import re
# split 切割
ret=re.split('\d+','alex222wusir')
print(ret)
ret=re.split('(\d+)','alex666wusir')
print(ret)
ret=re.split('\d(\d)\d','alex123wusir')
print(ret)

# sub 替换
ret=re.sub('\d+','S','alex1111B222')
print(ret)
ret=re.sub('\d+','S','alex1111B222',1) # 只替换一次
print(ret)

# subn 替换完并返回替换的次数
ret=re.subn('\d+','S','alex1111B222')
print(ret)

# match 匹配字符串必须是什么样子，而search用来寻找这个字符串是不是含有满足条件的子内容
ret=re.match('\d+','ddd456')
print(ret)
ret=re.match('\d+','123ddd456') # 相当如re.search('^\d+','123ddd456')
print(ret)
print(ret.group())

ret=re.search('^\d+','123ddd456')
print(ret)
print(ret.group())

'''
时间和空间的问题
列表通过索引取值非常快，不占用空间，列表最好不要用insert，也不要用pop
字典通过key获取值也非常快，但是占用空间
'''

# compile 重要
# 假如同一个正则表达式要被使用多次，可以先用compile先编译，然后直接用编译的结果来使用
# 节省了多次解析同一个正则表达式的时间
print('---compile---')
ret=re.compile('\d+')
res1=ret.search('123messi')
print(res1)
print(res1.group())
res2=ret.findall('123messi')
print(res2)

# finditer 重要
# 如果通过正则匹配后，有很多条记录匹配，则多次数据会存在内存中，占用存储空间，这个时候finditer就出现了
print('---finditer---')
ret=re.finditer('\d+','abc123def456')
for item in ret:
    print(item.group())

# 如何写，既节省时间，又节省空间呢？先compile（如果没有重复使用同一个正则，也不能节省时间），在finditer
print('---compile+finditer---')
ret=re.compile('\d+')
res=ret.finditer('abc123def456')
for item in res:
    print(item.group())
